home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!rs
- From: rs@uunet.UU.NET (Rich Salz)
- Newsgroups: comp.sources.unix
- Subject: v10i024: Logo interpreter for Unix, Part04/06
- Message-ID: <450@uunet.UU.NET>
- Date: 24 Jun 87 20:21:53 GMT
- Organization: UUNET Communications Services, Arlington, VA
- Lines: 894
- Approved: rs@uunet.uu.net
-
- Submitted by: Brian Harvey <bh@mit-amt>
- Mod.Sources: Volume 10, Number 24
- Archive-Name: logo/Part04
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 4 (of 6)."
- # Contents: logo.y
- # Wrapped by rsalz@pineapple.bbn.com on Wed Jun 24 14:26:59 1987
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f logo.y -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"logo.y\"
- else
- echo shar: Extracting \"logo.y\" \(19535 characters\)
- sed "s/^X//" >logo.y <<'END_OF_logo.y'
- X
- X%nonassoc LOWPREC
- X%nonassoc '<' '>' '='
- X%left '+' '-'
- X%left '*' '/' '\\'
- X%left '^'
- X%left UNARY
- X%token TWOOP ONEOP NOOP ONECOM
- X%token CSTRING UINT
- X%token LTO IFCOM LEDIT LIFTF LTRACE
- X%token LPROC LPEND LAEND LGO
- X%token CLIST TWOCOM NOCOM
- X%token RUNCOM RNEND REPCOM THREECOM
- X%{
- X#include "logo.h"
- X
- Xchar popname[NAMELEN+1];
- Xint multnum;
- Xstruct object *multarg = 0;
- X#include <setjmp.h>
- Xextern jmp_buf runret;
- Xjmp_buf yerrbuf;
- Xint catching = 0;
- Xint flagquit = 0;
- Xextern struct runblock *thisrun;
- X#ifndef NOTURTLE
- Xextern int turtdes;
- Xextern struct display *mydpy;
- X#endif
- Xint errtold = 0;
- Xint yyline =0;
- Xchar ibuf[IBUFSIZ] ={0};
- Xchar *ibufptr =NULL;
- Xchar *getbpt =0;
- Xchar titlebuf[100] ={0};
- Xchar *titleptr =NULL;
- Xextern char *cpystr();
- Xint letflag =0;
- Xint topf =0;
- Xint pflag =0;
- Xchar charib =0;
- Xint endflag =0, rendflag = 0;
- Xint traceflag =0;
- Xint currtest = 0;
- Xint argno =(-1);
- Xint *stkbase =NULL;
- Xint stkbi =0;
- Xstruct stkframe *fbr =NULL;
- Xstruct plist *proclist =NULL;
- X#ifdef PAUSE
- Xint pauselev = 0;
- Xextern int psigflag,errpause;
- X#endif
- X
- Xstruct object *add(), *sub(), *mult(), *div(), *rem(), *and(), *or();
- Xstruct object *greatp(), *lessp(), *lmax(), *lmin(), *lis();
- Xstruct object *worcat(), *sencat(), *equal(), *lemp(), *comp();
- Xstruct object *lnump(), *lsentp(), *lwordp(), *length(), *zerop();
- Xstruct object *first(), *butfir(), *last(), *butlas(), *alllk();
- Xstruct object *lnamep(), *lrandd(), *rnd(), *sq(), *lpow(), *lsin();
- Xstruct object *lcos(), *latan(), *ltime(), *request(), *readlist();
- Xstruct object *cmprint(), *cmtype(), *cmoutput(), *lsleep(), *lbreak();
- Xstruct object *cmlocal(), *assign(), *cmedit(), *lstop(), *show(), *erase();
- Xstruct object *help(), *describe(), *ltrace(), *luntrace(), *lbyecom();
- Xstruct object *sometrace();
- X#ifndef NOTURTLE
- Xstruct object *getturtle(), *forward(), *back();
- Xstruct object *left(), *right(), *penup(), *cmpendown(), *clearscreen();
- Xstruct object *fullscreen(), *splitscreen(), *showturtle();
- Xstruct object *hideturtle(), *textscreen(), *cmpenerase(), *pencolor();
- Xstruct object *wipeclean(), *penmode(), *penreverse(), *shownp(), *towardsxy();
- Xstruct object *setcolor(), *setxy(), *setheading();
- Xstruct object *xcor(), *ycor(), *heading(), *getpen();
- Xstruct object *scrunch(), *setscrunch();
- X#endif
- Xstruct object *ltopl(), *cmfprint(), *cmftype(), *pots(), *fput(), *lput();
- Xstruct object *list(), *loread(), *lowrite(), *fileclose(), *cbreak();
- Xstruct object *lfread(), *lfword(), *fileprint(), *filefprint();
- Xstruct object *filetype(), *fileftype(), *callunix(), *repcount();
- X#ifdef DEBUG
- Xstruct object *setdebquit(), *setmemtrace(), *setyaccdebug();
- X#endif
- Xstruct object *readchar(), *keyp(), *intpart(), *round(), *toascii();
- Xstruct object *tochar(), *loflush(), *settest(), *memberp(), *item();
- X#ifdef PAUSE
- Xstruct object *unpause(), *dopause(), *setipause(), *setqpause(); /* PAUSE */
- Xstruct object *seterrpause(), *clrerrpause();
- X#endif
- X#ifdef FLOOR
- Xstruct object *hitoot(), *lotoot(), *lampon(), *lampoff();
- Xstruct object *ftouch(), *btouch(), *ltouch(), *rtouch();
- X#endif
- X#ifndef SMALL
- Xstruct object *gprop(), *plist(), *pps(), *remprop();
- X#endif
- X#ifdef SETCURSOR
- Xstruct object *clrtxt(), *setcur();
- X#endif
- X
- Xstruct lexstruct keywords[] =
- X{
- X "sum",TWOOP,add,NULL,
- X "difference",TWOOP,sub,"diff",
- X "product",TWOOP,mult,NULL,
- X "quotient",TWOOP,div,NULL,
- X "remainder",TWOOP,rem,"mod",
- X "both",TWOOP,and,"and",
- X "either",TWOOP,or,"or",
- X "greaterp",TWOOP,greatp,NULL,
- X "lessp",TWOOP,lessp,NULL,
- X "maximum",TWOOP,lmax,"max",
- X "minimum",TWOOP,lmin,"min",
- X "is",TWOOP,lis,NULL,
- X "word",TWOOP,worcat,NULL,
- X "sentence",TWOOP,sencat,"se",
- X "equalp",TWOOP,equal,NULL,
- X "emptyp",ONEOP,lemp,NULL,
- X "not",ONEOP,comp,NULL,
- X "numberp",ONEOP,lnump,NULL,
- X "sentencep",ONEOP,lsentp,NULL,
- X "wordp",ONEOP,lwordp,NULL,
- X "count",ONEOP,length,NULL,
- X "zerop",ONEOP,zerop,NULL,
- X "first",ONEOP,first,NULL,
- X "butfirst",ONEOP,butfir,"bf",
- X "last",ONEOP,last,NULL,
- X "butlast",ONEOP,butlas,"bl",
- X "thing",ONEOP,alllk,NULL,
- X "namep",ONEOP,lnamep,NULL,
- X "random",ONEOP,rnd,"rnd",
- X "sqrt",ONEOP,sq,NULL,
- X "pow",TWOOP,lpow,NULL,
- X "sin",ONEOP,lsin,NULL,
- X "cos",ONEOP,lcos,NULL,
- X "arctan",ONEOP,latan,"atan",
- X "time",NOOP,ltime,NULL,
- X "request",NOOP,request,NULL,
- X "readlist",NOOP,readlist,"rl",
- X "print",ONECOM,cmprint,"pr",
- X "type",ONECOM,cmtype,NULL,
- X "output",ONECOM,cmoutput,"op",
- X "wait",ONECOM,lsleep,NULL,
- X "local",ONECOM,cmlocal,NULL,
- X "make",TWOCOM,assign,NULL,
- X "if",IFCOM,0,NULL,
- X "to",LTO,0,NULL,
- X "end",LPEND,0,NULL,
- X "stop",NOCOM,lstop,NULL,
- X "break",NOCOM,lbreak,NULL,
- X "edit",LEDIT,cmedit,"ed",
- X "go",LGO,0,NULL,
- X "show",ONECOM,show,"po",
- X "erase",ONECOM,erase,"er",
- X "help",NOCOM,help,NULL,
- X "describe",ONECOM,describe,NULL,
- X "trace",LTRACE,sometrace,NULL,
- X "untrace",NOCOM,luntrace,NULL,
- X "goodbye",NOCOM,lbyecom,"bye",
- X#ifndef NOTURTLE
- X "turtle",ONECOM,getturtle,"tur",
- X "forward",ONECOM,forward,"fd",
- X "back",ONECOM,back,"bk",
- X "left",ONECOM,left,"lt",
- X "right",ONECOM,right,"rt",
- X#ifdef FLOOR
- X "hitoot",ONECOM,hitoot,"hit",
- X "lotoot",ONECOM,lotoot,"lot",
- X "lampon",NOCOM,lampon,"lon",
- X "lampoff",NOCOM,lampoff,"loff",
- X#endif
- X "penup",NOCOM,penup,"pu",
- X "pendown",NOCOM,cmpendown,"pd",
- X "clearscreen",NOCOM,clearscreen,"cs",
- X "fullscreen",NOCOM,fullscreen,"full",
- X "splitscreen",NOCOM,splitscreen,"split",
- X "showturtle",NOCOM,showturtle,"st",
- X "hideturtle",NOCOM,hideturtle,"ht",
- X "textscreen",NOCOM,textscreen,"text",
- X "penerase",NOCOM,cmpenerase,"pe",
- X "pencolor",ONECOM,pencolor,"penc",
- X "setcolor",TWOCOM,setcolor,"setc",
- X "setxy",TWOCOM,setxy,NULL,
- X "setheading",ONECOM,setheading,"seth",
- X "wipeclean",NOCOM,wipeclean,"clean",
- X "penmode",NOOP,penmode,NULL,
- X "penreverse",NOCOM,penreverse,"px",
- X "shownp",NOOP,shownp,NULL,
- X "towardsxy",TWOOP,towardsxy,NULL,
- X#ifdef FLOOR
- X "ftouch",NOOP,ftouch,"fto",
- X "btouch",NOOP,btouch,"bto",
- X "ltouch",NOOP,ltouch,"lto",
- X "rtouch",NOOP,rtouch,"rto",
- X#endif
- X "xcor",NOOP,xcor,NULL,
- X "ycor",NOOP,ycor,NULL,
- X "heading",NOOP,heading,NULL,
- X "getpen",NOOP,getpen,NULL,
- X "scrunch",NOOP,scrunch,NULL,
- X "setscrunch",ONECOM,setscrunch,"setscrun",
- X#endif
- X "toplevel",NOCOM,ltopl,NULL,
- X "fprint",ONECOM,cmfprint,"fp",
- X "ftype",ONECOM,cmftype,"fty",
- X "pots",NOCOM,pots,NULL,
- X "fput",TWOOP,fput,NULL,
- X "lput",TWOOP,lput,NULL,
- X "list",TWOOP,list,NULL,
- X "openread",ONEOP,loread,"openr",
- X "openwrite",ONEOP,lowrite,"openw",
- X "close",ONECOM,fileclose,NULL,
- X "fileread",ONEOP,lfread,"fird",
- X "fileword",ONEOP,lfword,"fiwd",
- X "fileprint",TWOCOM,fileprint,"fip",
- X "filefprint",TWOCOM,filefprint,"fifp",
- X "filetype",TWOCOM,filetype,"fity",
- X "fileftype",TWOCOM,fileftype,"fifty",
- X "unix",ONECOM,callunix,NULL,
- X "run",RUNCOM,0,NULL,
- X "repeat",REPCOM,0,NULL,
- X "repcount",NOOP,repcount,NULL,
- X#ifdef DEBUG
- X "debquit",NOCOM,setdebquit,NULL,
- X "memtrace",NOCOM,setmemtrace,NULL,
- X "yaccdebug",NOCOM,setyaccdebug,NULL,
- X#endif
- X "cbreak",ONECOM,cbreak,NULL,
- X "readchar",NOOP,readchar,"rc",
- X "keyp",NOOP,keyp,NULL,
- X "int",ONEOP,intpart,NULL,
- X "round",ONEOP,round,NULL,
- X "ascii",ONEOP,toascii,NULL,
- X "char",ONEOP,tochar,NULL,
- X "oflush",NOCOM,loflush,NULL,
- X#ifndef SMALL
- X "gprop",TWOOP,gprop,NULL,
- X "plist",ONEOP,plist,NULL,
- X "pprop",THREECOM,0,NULL,
- X "pps",NOCOM,pps,NULL,
- X "remprop",TWOCOM,remprop,NULL,
- X#endif
- X "test",ONECOM,settest,NULL,
- X "iftrue",LIFTF,(struct object *(*)())1,"ift",
- X "iffalse",LIFTF,0,"iff",
- X "memberp",TWOOP,memberp,NULL,
- X "item",TWOOP,item,"nth",
- X#ifdef PAUSE
- X "continue",NOCOM,unpause,"co",
- X "pause",NOCOM,dopause,NULL,
- X "setipause",NOCOM,setipause,NULL,
- X "setqpause",NOCOM,setqpause,NULL,
- X "errpause",NOCOM,seterrpause,NULL,
- X "errquit",NOCOM,clrerrpause,NULL,
- X#endif
- X#ifdef SETCURSOR
- X "cleartext",NOCOM,clrtxt,"ct",
- X "setcursorxy",TWOCOM,setcur,"setcxy",
- X#endif
- X NULL,NULL,NULL,NULL,
- X};
- X
- X#define uperror {errtold++;YYERROR;}
- X
- X#ifdef PAUSE
- X#define catch(X) {if(!setjmp(yerrbuf)){if(flagquit)errhand();catching++;X;catching=0;}else{catching=0;uperror}}
- X#else
- X#define catch(X) {X;}
- X#endif
- X%}
- X%%
- Xstart_sym : |
- X start_sym command ={
- X popname[0] = '\0';
- X#ifdef PAUSE
- X if (psigflag) dopause();
- X#endif
- X yyprompt(1);
- X } |
- X start_sym error ={
- X popname[0] = '\0';
- X if (!errtold) {
- X logoyerror();
- X }
- X errtold = 0;
- X errwhere();
- X#ifdef PAUSE
- X if ((!errpause&&!pauselev) || !fbr)
- X#endif
- X errzap();
- X yyerrok;yyclearin;
- X yyprompt(0);
- X };
- Xcommand :
- X LEDIT rnewline ={
- X catch(doedit(););
- X $$ = -1;
- X } |
- X LTRACE rnewline ={
- X catch(ltrace(););
- X $$ = -1;
- X } |
- X onecom valuearg newline ={
- X catch($$=(int)(*keywords[$1].lexval)($2););} |
- X onecom error ={notenf($1);uperror;} |
- X TWOCOM valuearg valuearg newline ={
- X catch((*keywords[$1].lexval)($2,$3);); $$ = -1;} |
- X TWOCOM error ={notenf($1);uperror;} |
- X THREECOM valuearg valuearg valuearg newline ={
- X#ifndef SMALL
- X catch(pprop($2,$3,$4););
- X#endif
- X $$ = -1;
- X } |
- X THREECOM error ={
- X if (!errtold) {
- X puts("Not enough inputs to pprop.");
- X }
- X uperror;
- X } |
- X rnewline ={ $$= -1; } |
- X NOCOM newline ={
- X catch((*keywords[$1].lexval)();); $$= -1;} |
- X LGO white3 valuearg newline ={
- X catch(go($3););
- X $$= -1;
- X } |
- X LGO error ={notenf($1);uperror;} |
- X ifcall ={
- X if (($1 != -1) && !endflag) {
- X if (!errtold)
- X pf1("You don't say what to do with %l.\n",$1);
- X uperror;
- X }
- X $$ = $1;
- X } |
- X title ={
- X if ($1== -1)
- X uperror
- X else
- X catch(proccreate($1););
- X $$ = -1;
- X } |
- X arg newline {
- X if (thisrun && !pflag) {
- X $$ = $1;
- X } else {
- X if(($1 != -1) && !endflag) {
- X if (!errtold)
- X pf1("You don't say what to do with %l\n",$1);
- X uperror;
- X }
- X }
- X } ;
- X
- Xonecom : ONECOM | LEDIT | LTRACE ;
- X
- Xvaluearg: userarg ={
- X if ($1 == -1) {
- X if (!errtold) {
- X printf("%s didn't output.\n",
- X popname);
- X }
- X uperror;
- X }
- X } |
- X sysarg ;
- X
- Xlabint : UINT %prec UNARY ={ yyline=((struct object *)$1)->obint; mfree($1); $$ = 0;};
- X
- Xarg : userarg | sysarg ;
- X
- Xuserarg : proccall %prec UNARY |
- X runcall %prec LOWPREC ;
- X
- Xsysarg : TWOOP valuearg valuearg %prec LOWPREC ={
- X catch($$=(int)(*keywords[$1].lexval)($2,$3););
- X } |
- X TWOOP valuearg error %prec LOWPREC ={op2er1($1,$2);uperror;} |
- X TWOOP error %prec LOWPREC ={notenf($1);uperror;} |
- X ONEOP valuearg %prec LOWPREC ={
- X catch($$=(int)(*keywords[$1].lexval)($2););
- X } |
- X ONEOP error %prec LOWPREC ={notenf($1);uperror;} |
- X NOOP %prec LOWPREC ={
- X catch($$=(int)(*keywords[$1].lexval)(););
- X } |
- X UINT %prec LOWPREC |
- X '\"' CSTRING { $$=$2; } |
- X '[' CLIST ']' { $$=$2; } |
- X ':' CSTRING {
- X catch($$=(int)alllk($2););
- X } |
- X valuearg '+' valuearg ={
- X catch($$=(int)add($1,$3););
- X } |
- X valuearg '+' error ={inferr($1,$2);uperror;} |
- X valuearg '-' valuearg ={
- X catch($$=(int)sub($1,$3););
- X } |
- X valuearg '-' error ={inferr($1,$2);uperror;} |
- X '-' valuearg %prec UNARY ={
- X catch($$=(int)opp($2););
- X } |
- X '-' error %prec UNARY ={unerr('-');uperror;} |
- X valuearg '^' valuearg {
- X catch($$=(int)lpow($1,$3););
- X } |
- X valuearg '^' error { inferr($1,$2);uperror; } |
- X valuearg '*' valuearg ={
- X catch($$=(int)mult($1,$3););
- X } |
- X valuearg '*' error ={inferr($1,$2);uperror;} |
- X valuearg '/' valuearg ={
- X catch($$=(int)div($1,$3););
- X } |
- X valuearg '/' error ={inferr($1,$2);uperror;} |
- X valuearg '\\' valuearg ={
- X catch($$=(int)rem($1,$3););
- X } |
- X valuearg '\\' error ={inferr($1,$2);uperror;} |
- X valuearg '=' valuearg ={
- X catch($$=(int)equal($1,$3);)
- X } |
- X valuearg '=' error ={inferr($1,$2);uperror;} |
- X valuearg '<' valuearg ={
- X catch($$=(int)lessp($1,$3););
- X } |
- X valuearg '<' error ={inferr($1,$2);uperror;} |
- X valuearg '>' valuearg ={
- X catch($$=(int)greatp($1,$3););
- X } |
- X valuearg '>' error ={inferr($1,$2);uperror;} |
- X '{' TWOOP oparglist rbrak {
- X catch($$=multiop($2,globcopy(multarg)););
- X lfree(multarg);
- X multarg = 0;
- X }|
- X '(' TWOOP oparglist rbrak {
- X catch($$=multiop($2,globcopy(multarg)););
- X lfree(multarg);
- X multarg = 0;
- X }|
- X '(' valuearg rbrak ={$$=$2;} ;
- X
- Xoparglist : valuearg ={
- X catch(multarg = globcons($1,0););
- X mfree($1);
- X multnum = 1;
- X } |
- X valuearg oparglist ={
- X catch(multarg = globcons($1,multarg););
- X mfree($1);
- X multnum++;
- X };
- Xtitle : tbegin varlist '\n' ={
- X strcpy(titleptr,"\n");
- X $$=$1;
- X } |
- X tbegin '\n' ={
- X strcpy(titleptr,"\n");
- X $$=$1;
- X } |
- X tbegin varlist error ={
- X mfree($1);
- X terr();
- X $$= -1;
- X } |
- X tbegin error ={
- X mfree($1);
- X terr();
- X $$= -1;
- X };
- Xtbegin : LTO LPROC ={
- X titleptr=cpystr(titlebuf,"to ",
- X ((struct object *)($2))->obstr,NULL);
- X $$=$2;
- X } |
- X LTO primitive ={
- X if (!errtold) printf("Can't redefine primitive %s\n",
- X keywords[$2].word);
- X uperror;
- X };
- Xprimitive : NOOP | ONEOP | TWOOP | NOCOM | ONECOM | TWOCOM | THREECOM
- X | IFCOM | LTO | LEDIT | LIFTF | LGO
- X | RUNCOM | REPCOM | LPEND ;
- Xvarlist : varsyn ={titleptr=cpystr(titleptr," :",
- X ((struct object *)($1))->obstr,NULL);
- X mfree($1);
- X } |
- X varlist varsyn {titleptr=cpystr(titleptr," :",
- X ((struct object *)($2))->obstr,NULL);
- X mfree($2);
- X } ;
- Xvarsyn : ':' CSTRING {$$=$2;};
- Xproccall : procname args argend commlist procend ={
- X $$=$4;
- X frmpop($4);
- X } |
- X procname error ={
- X if (!errtold) printf("Not enough inputs to %s\n",
- X proclist->procname->obstr);
- X uperror;
- X };
- Xargs: | arglist;
- Xarglist : valuearg %prec LOWPREC ={
- X catch(argassign($1););
- X } |
- X arglist valuearg %prec LOWPREC ={
- X catch(argassign($2););
- X } ;
- Xargend : LAEND ={procprep();};
- Xcommlist : ={yyline=1; $$ = -1;} |
- X commlist labint command ={
- X popname[0] = '\0';
- X#ifdef PAUSE
- X if (psigflag) dopause();
- X if (thisrun && thisrun->str == (struct object *)(-1))
- X yyprompt(1);
- X#endif
- X $$=$3;
- X } |
- X commlist command ={
- X popname[0] = '\0';
- X if (pflag) yyline++;
- X#ifdef PAUSE
- X if (psigflag) dopause();
- X if (thisrun && thisrun->str == (struct object *)(-1))
- X yyprompt(1);
- X#endif
- X $$=$2;
- X } |
- X commlist error ={
- X popname[0] = '\0';
- X#ifdef PAUSE
- X if ((!errpause&&!pauselev) || !fbr)
- X#endif
- X uperror;
- X#ifdef PAUSE
- X if (!errtold) {
- X logoyerror();
- X }
- X errtold = 0;
- X errwhere();
- X yyerrok;yyclearin;
- X if (thisrun && thisrun->str == (struct object *)(-1))
- X yyprompt(0);
- X#endif
- X };
- Xprocend : LPEND |
- X labint LPEND ;
- Xprocname : LPROC ={
- X catch(newproc($1););
- X };
- Xrcommlist : ={$$ = -1;} |
- X rcommlist command ={
- X popname[0] = '\0';
- X#ifdef PAUSE
- X if (psigflag) dopause();
- X if (thisrun && thisrun->str == (struct object *)(-1))
- X yyprompt(1);
- X#endif
- X $$=$2;
- X } |
- X rcommlist error ={
- X popname[0] = '\0';
- X#ifdef PAUSE
- X if ((!errpause&&!pauselev) || !fbr)
- X#endif
- X uperror;
- X#ifdef PAUSE
- X if (!errtold) {
- X logoyerror();
- X }
- X errtold = 0;
- X errwhere();
- X yyerrok;yyclearin;
- X if (thisrun && thisrun->str == (struct object *)(-1))
- X yyprompt(0);
- X#endif
- X };
- Xruncall : realrun | reprun | ifrun ;
- Xrealrun : runstart rcommlist runend ={
- X unrun();
- X $$ = $2;
- X strcpy(popname,"run");
- X };
- Xreprun : reprstart rcommlist runend ={
- X unrun();
- X $$ = $2;
- X strcpy(popname,"repeat");
- X };
- Xifrun : ifrstart rcommlist runend ={
- X unrun();
- X $$ = $2;
- X strcpy(popname,"if");
- X };
- Xrunstart : RUNCOM valuearg %prec LOWPREC ={
- X catch(dorun($2,(FIXNUM)0););
- X } ;
- Xreprstart : REPCOM valuearg valuearg %prec LOWPREC ={
- X catch(dorep($2,$3););
- X } ;
- Xifrstart : IFCOM valuearg valuearg valuearg %prec LOWPREC ={
- X {
- X int i;
- X
- X catch(i = truth($2););
- X if (i) {
- X catch(dorun($3,(FIXNUM)0););
- X mfree($4);
- X } else {
- X catch(dorun($4,(FIXNUM)0););
- X mfree($3);
- X }
- X }
- X } |
- X IFCOM error ={
- X if (!errtold) printf("Not enough inputs to if.\n");
- X uperror;
- X } ;
- Xrunend : RNEND;
- Xifcall : ifstart rcommlist runend ={
- X unrun();
- X $$ = $2;
- X };
- Xifstart : IFCOM valuearg valuearg rnewline ={
- X {
- X int i;
- X
- X catch(i = truth($2););
- X if (i) {catch(dorun($3,(FIXNUM)0););}
- X else {
- X catch(dorun(0,(FIXNUM)0););
- X mfree($3);
- X }
- X }
- X } |
- X LIFTF valuearg newline ={
- X if ((int)keywords[$1].lexval==currtest) {
- X catch(dorun($2,(FIXNUM)0););
- X } else {
- X catch(dorun(0,(FIXNUM)0););
- X mfree($2);
- X }
- X } ;
- Xwhite3 : | LTO ;
- Xrbrak : '}' | ')' ;
- Xnewline : '\n' | ';' | ;
- Xrnewline : '\n' | ';' ;
- X%%
- X
- Xextern struct object *makelist();
- X
- X#ifdef PAUSE
- Xyylex1()
- X#else
- Xyylex()
- X#endif
- X{
- X register char *str;
- X char s[100];
- X char c;
- X register pc;
- X register i;
- X NUMBER dubl;
- X int floatflag;
- X FIXNUM fixn;
- X
- X if (yyerrflag) return(1);
- X else if (argno==0 && pflag!=1) {
- X if (fbr->oldyyc==-2) fbr->oldyyc= -1;
- X return(LAEND);
- X } else if (endflag==1 && pflag>1) {
- X endflag=0;
- X return(LPEND);
- X }
- X else if (pflag==2) {
- X pc= *(stkbase+stkbi++);
- X if (stkbi==PSTKSIZ-1) {
- X stkbase= (int *)(*(stkbase+PSTKSIZ-1));
- X stkbi=1;
- X }
- X yylval= *(stkbase+stkbi++);
- X if (pc==LPROC || pc==CSTRING || pc==UINT || pc==CLIST) {
- X yylval=(int)localize((struct object *)yylval);
- X }
- X if (stkbi==PSTKSIZ-1) {
- X stkbase= (int *)(*(stkbase+PSTKSIZ-1));
- X stkbi=1;
- X }
- X if (pc== -1) return(0);
- X else return(pc);
- X } else if (letflag==1) {
- X str=s;
- X while (!index(" \t\n[](){}\";",(c = getchar()))) {
- X if (c == '\\') c = getchar() /* |0200 */ ;
- X else if (c == '%') c = ' ' /* |0200 */ ;
- X *str++ = c;
- X }
- X charib=c;
- X *str='\0';
- X yylval=(int)localize(objcpstr(s));
- X letflag=0;
- X return(CSTRING);
- X } else if (letflag==2) {
- X str = s;
- X while (( (c=getchar())>='a' && c<='z' )
- X || (c>='A' && c<='Z') || (c>='0' && c<='9')
- X || (c=='.') || (c=='_') ) {
- X if (c>='A' && c<='Z') c += 040;
- X *str++ = c;
- X }
- X charib = c;
- X *str = '\0';
- X letflag = 0;
- X yylval = (int)localize(objcpstr(s));
- X return(CSTRING);
- X }
- X else if (letflag==3) {
- X yylval = (int)makelist();
- X letflag = 4;
- X return(CLIST);
- X }
- X else if (letflag==4) {
- X letflag = 0;
- X return(yylval = getchar());
- X }
- X while ((c=getchar())==' ' || c=='\t')
- X ;
- X if (rendflag) {
- X getbpt = 0;
- X if (rendflag < 3)
- X --rendflag;
- X else if (!thisrun || thisrun->svpflag)
- X rendflag = 0;
- X return(RNEND);
- X }
- X
- X if (c == '!') /* comment feature */
- X while ((c=getchar()) && (c != '\n')) ;
- X
- X if ((c<'a' || c>'z') && (c<'A' || c>'Z')
- X && (c<'0' || c>'9') && c!='.') {
- X yylval=c;
- X if (c=='\"') letflag=1;
- X if (c==':') letflag=2;
- X if (c=='[') letflag=3;
- X return(c);
- X }
- X else if ((c>='0' && c<='9')|| c=='.') {
- X floatflag = (c=='.');
- X str=s;
- X while ((c>='0' && c<='9')||(c=='E')||(c=='e')||(c=='.')) {
- X *str++=c;
- X if (c=='.') floatflag++;
- X if ((c=='e')||(c=='E')) {
- X floatflag++;
- X c = getchar();
- X if ((c=='+')||(c=='-')) {
- X *str++ = c;
- X c = getchar();
- X }
- X } else c=getchar();
- X }
- X charib=c;
- X *str='\0';
- X if (floatflag) {
- X sscanf(s,EFMT,&dubl);
- X yylval=(int)localize(objdub(dubl));
- X } else {
- X sscanf(s,FIXFMT,&fixn);
- X yylval=(int)localize(objint(fixn));
- X }
- X return(UINT);
- X } else {
- X if (c < 'a') c += 040;
- X yylval=(int)(str=s);
- X *str++=c;
- X c=getchar();
- X if (c >= 'A' && c <= 'Z') c += 040;
- X while ((c>='a' && c<='z') || (c>='0' && c<='9')
- X || (c=='.') || (c=='_')) {
- X *str++=c;
- X c=getchar();
- X if (c >= 'A' && c <= 'Z') c += 040;
- X }
- X charib=c;
- X *str='\0';
- X for (i=0; keywords[i].word; i++) {
- X if (!strcmp(yylval,keywords[i].word) ||
- X (keywords[i].abbr &&
- X !strcmp(yylval,keywords[i].abbr))) {
- X yylval=i;
- X return(keywords[i].lexret);
- X }
- X }
- X yylval=(int)localize(objcpstr(s));
- X return(LPROC);
- X }
- X}
- X
- X#ifdef PAUSE
- Xyylex() {
- X int x;
- X
- X if (catching) return(yylex1());
- X if (!setjmp(yerrbuf)) {
- X if (flagquit) errhand();
- X catching++;
- X x = yylex1();
- X catching=0;
- X return(x);
- X } else {
- X catching=0;
- X return(12345); /* This should cause an error up there */
- X }
- X}
- X#endif
- X
- Xint isuint(x)
- Xint x;
- X{
- X return(x == UINT);
- X}
- X
- Xint isstored(x)
- Xint x;
- X{
- X return(x==UINT || x==LPROC || x==CSTRING || x==CLIST);
- X}
- X
- Xyyprompt(clear) {
- X register int i;
- X
- X if (!ibufptr && !getbpt && !pflag) {
- X flagquit = 0;
- X#ifdef PAUSE
- X if (pauselev > 0) {
- X for (i=pauselev; --i >=0; )
- X putchar('-');
- X }
- X#endif
- X putchar('?');
- X#ifndef NOTURTLE
- X if ((turtdes<0) && clear)
- X (*mydpy->state)('*');
- X#endif
- X fflush(stdout);
- X }
- X}
- X
- END_OF_logo.y
- if test 19535 -ne `wc -c <logo.y`; then
- echo shar: \"logo.y\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- echo shar: End of archive 4 \(of 6\).
- cp /dev/null ark4isdone
- MISSING=""
- for I in 1 2 3 4 5 6 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 6 archives.
- echo "Now see the README"
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-